package com.mjf.spark.day04

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * 转换算子-groupByKey
 *    根据key对RDD中的元素进行分组
 *
 * reduceByKey和groupByKey区别：
 *      1）reduceByKey：按照key进行聚合，在shuffle之前有combine（预聚合）操作，返回结果是RDD[k,v]。
 *      2）groupByKey：按照key进行分组，直接进行shuffle。
 *      3）开发指导：在不影响业务逻辑的前提下，优先选用reduceByKey。求和操作不影响业务逻辑，求平均值影响业务逻辑。
 */
object Spark03_Transformation_groupByKey {
  def main(args: Array[String]): Unit = {

    // 创建SparkConf配置文件
    val conf = new SparkConf().setMaster("local[*]").setAppName("Spark03_Transformation_groupByKey")
    // 创建SparkContext对象
    val sc = new SparkContext(conf)

    val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a", 1), ("b", 5), ("a", 5), ("b", 2)))

    // 根据key对RDD中的元素进行分组，将key对应的value放入集合
    val groupRDD: RDD[(String, Iterable[Int])] = rdd.groupByKey()

    val resRDD: RDD[(String, Int)] = groupRDD.map {
      case (key, datas) => {
        (key, datas.sum)
      }
    }

    resRDD.collect().foreach(println)

    // 关闭连接
    sc. stop()

  }
}

